package cn.lili.modules.goods.util;

import cn.hutool.json.JSONObject;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.exception.ServiceException;
import cn.lili.common.utils.HttpUtils;
import cn.lili.modules.goods.entity.dos.Commodity;
import cn.lili.modules.goods.entity.dos.Studio;
import cn.lili.modules.goods.entity.dto.GoodsInfo;
import cn.lili.modules.wechat.util.WechatAccessTokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 微信小程序直播工具类
 *
 * @author Bulbasaur
 * @since 2021/5/17 10:16 上午
 */
@Slf4j
@Component
public class WechatLivePlayerUtil {

	@Autowired
	private WechatAccessTokenUtil wechatAccessTokenUtil;
	@Autowired
	private WechatMediaUtil wechatMediaUtil;

	/**
	 * 创建小程序直播间
	 *
	 * @param studio
	 *            小程序直播
	 * @return 房间ID
	 */
	public Map<String, String> create(Studio studio) {
		// 发送url
		String url = "https://api.weixin.qq.com/wxaapi/broadcast/room/create?access_token=";
		// 添加直播间
		Map<String, String> map = this.mockRoom(studio);
		JSONObject json = this.doPostWithJson(url, map);
		Map<String, String> roomMap = new HashMap<>(2);
		roomMap.put("roomId", json.getStr("roomId"));
		roomMap.put("qrcodeUrl", json.getStr("qrcode_url"));
		return roomMap;
	}

	/**
	 * 创建小程序直播间
	 *
	 * @param studio
	 *            小程序直播
	 * @return 房间ID
	 */
	public boolean editRoom(Studio studio) {
		// 发送url
		String url = "https://api.weixin.qq.com/wxaapi/broadcast/room/editroom?access_token=";

		// 修改直播间
		Map<String, String> map = this.mockRoom(studio);
		map.put("id", studio.getRoomId().toString());
		this.doPostWithJson(url, map);
		return true;
	}

	/**
	 * 获取直播间回放
	 *
	 * @param roomId
	 *            房间ID
	 * @return 回放地址
	 */
	public String getLiveInfo(Integer roomId) {
		// 发送url
		String url = "https://api.weixin.qq.com/wxa/business/getliveinfo?access_token=";
		Map<String, Object> map = new HashMap<>(16);
		// 获取回放
		map.put("action", "get_replay");
		// 直播间ID
		map.put("room_id", roomId);
		// 起始拉取视频，0表示从第一个视频片段开始拉取
		map.put("start", "0");
		// 每次拉取的数量，建议100以内
		map.put("limit", "1");
		JSONObject json = this.doPostWithJson(url, map);
		// TODO get media_url
		return json.getStr("live_replay");
	}

	/**
	 * 推送直播间商品
	 *
	 * @param roomId
	 *            房间ID
	 * @param goodsId
	 *            商品ID
	 * @return 操作结果
	 */
	public Boolean pushGoods(Integer roomId, Integer goodsId) {
		// 发送url
		String url = "https://api.weixin.qq.com/wxaapi/broadcast/room/addgoods?access_token=";
		Map<String, Object> map = new HashMap<>(16);
		// 直播间回放
		Integer[] ids = {goodsId};
		map.put("ids", ids);
		// 商品ID
		map.put("roomId", roomId);
		this.doPostWithJson(url, map);
		return true;
	}

	/**
	 * 删除直播间商品
	 *
	 * @param roomId
	 *            房间ID
	 * @param goodsId
	 *            商品ID
	 * @return 操作结果
	 */
	public Boolean goodsDeleteInRoom(Integer roomId, Integer goodsId) {
		// 发送url
		String url = "https://api.weixin.qq.com/wxaapi/broadcast/goods/deleteInRoom?access_token=";
		Map<String, Integer> map = new HashMap<>(2);
		// 直播间回放
		map.put("goodsId", goodsId);
		// 商品ID
		map.put("roomId", roomId);
		this.doPostWithJson(url, map);
		return true;

	}

	/**
	 * 添加直播商品
	 *
	 * @param commodity
	 *            直播商品
	 * @return 添加结果
	 */
	public JSONObject addGoods(Commodity commodity) {
		// 发送url
		String url = "https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token=";

		// 商品名称，最长14个汉字
		if (commodity.getName().length() > 14) {
			commodity.setName(commodity.getName().substring(0, 13));
		}

		// 新建微信商品DTO
		GoodsInfo goodsInfo = new GoodsInfo(commodity);
		// 上传微信临时图片
		goodsInfo.setCoverImgUrl(wechatMediaUtil.uploadMedia("image", commodity.getGoodsImage()));
		Map<String, GoodsInfo> map = new HashMap<>(2);
		// 调用新增直播商品接口
		map.put("goodsInfo", goodsInfo);
		return this.doPostWithJson(url, map);
	}

	/**
	 * 删除直播商品
	 *
	 * @param goodsId
	 *            商品ID
	 * @return 删除结果
	 */
	public JSONObject deleteGoods(String goodsId) {
		// 发送url
		String url = "https://api.weixin.qq.com/wxaapi/broadcast/goods/delete?access_token=";
		Map<String, Object> map = new HashMap<>(2);
		map.put("goodsId", goodsId);
		return this.doPostWithJson(url, map);
	}

	/**
	 * 查询直播商品状态
	 *
	 * @param goodsIdList
	 *            商品ID列表
	 * @return 删除结果
	 */
	public JSONObject getGoodsWareHouse(List<String> goodsIdList) {
		// 发送url
		String url = "https://api.weixin.qq.com/wxa/business/getgoodswarehouse?access_token=";
		Map<String, Object> map = new HashMap<>(2);
		map.put("goods_ids", goodsIdList);
		return this.doPostWithJson(url, map);
	}

	/**
	 * 请求微信接口
	 *
	 * @param url
	 *            链接
	 * @param map
	 *            参数
	 * @return 返回内容
	 */
	private JSONObject doPostWithJson(String url, Map map) {
		// 获取token
		String token = wechatAccessTokenUtil.cgiAccessToken(ClientTypeEnum.WECHAT_MP);
		// 请求链接添加token
		url += token;
		// 发起请求
		String content = HttpUtils.doPostWithJson(url, map);
		// 记录请求结果
		log.info("微信小程序请求结果：" + content);
		// 获取请求内容，如果token过期则重新获取，如果出错则抛出错误
		JSONObject jsonObject = new JSONObject(content);
		if (("0").equals(jsonObject.get("errcode").toString())) {
			return jsonObject;
		} else if (("40001").equals(jsonObject.get("errcode"))) {
			wechatAccessTokenUtil.removeAccessToken(ClientTypeEnum.WECHAT_MP);
			return this.doPostWithJson(url, map);
		} else {
			throw new ServiceException(jsonObject.get("errmsg").toString());
		}
	}

	private Map<String, String> mockRoom(Studio studio) {
		Map<String, String> map = new HashMap<>(16);
		// 背景图
		map.put("coverImg", wechatMediaUtil.uploadMedia("image", studio.getCoverImg()));
		// 分享图
		map.put("shareImg", wechatMediaUtil.uploadMedia("image", studio.getShareImg()));
		// 购物直播频道封面图
		map.put("feedsImg", wechatMediaUtil.uploadMedia("image", studio.getFeedsImg()));
		// 直播间名字
		map.put("name", studio.getName());
		// 直播计划开始时间
		map.put("startTime", studio.getStartTime());
		// 直播计划结束时间
		map.put("endTime", studio.getEndTime());
		// 主播昵称
		map.put("anchorName", studio.getAnchorName());
		// 主播微信号
		map.put("anchorWechat", studio.getAnchorWechat());
		// 直播间类型
		map.put("type", "0");
		// 是否关闭点赞
		map.put("closeLike", "0");
		// 是否关闭货架
		map.put("closeGoods", "0");
		// 是否关闭评论
		map.put("closeComment", "0");
		// 直播间名字
		map.put("closeReplay", "0");

		return map;
	}
}
